#!/bin/bash

# 颜色定义
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
RED='\033[0;31m'
BLUE='\033[0;34m'
NC='\033[0m' # 恢复默认颜色

# 测试场景1: 中断并重启同步
test_interrupted_sync() {
    echo -e "\n${BLUE}=== 测试场景1: 验证同步中断后重启 ===${NC}"
    
    # 清理现有环境
    echo -e "${YELLOW}- 清理现有环境...${NC}"
    docker compose -f docker-compose-test.yml down -v
    rm -rf data/*  
    
    # 启动MySQL和ES容器
    echo -e "${YELLOW}- 启动MySQL和Elasticsearch容器...${NC}"
    docker compose -f docker-compose-test.yml up -d mysql elasticsearch 
 
    sleep 20
    # 确认MySQL已就绪并有数据
    if docker exec -i test-mysql mysql -uroot -pmysqlpass -e "SELECT COUNT(*) FROM testdb.test_users;" 2>/dev/null | grep -q "1000"; then
        echo -e "${GREEN}✓ MySQL数据库已准备就绪，包含1000条数据${NC}"
    else
        echo -e "${RED}✗ MySQL数据准备失败${NC}"
        return 1
    fi
    
    # 启动同步进程
    echo -e "${YELLOW}- 启动数据同步进程...${NC}"
    docker compose -f docker-compose-test.yml up -d mysql-to-es-sync --build 
    
    # 等待同步开始但在同步完成前终止
    echo -e "${YELLOW}- 等待3秒后中断同步进程...${NC}"
    sleep 3
 

    # 查看ES中的数据量作为中断前状态
    PRE_COUNT=$(curl -s http://localhost:9200/test_users/_count | grep -o '"count":[0-9]*' | cut -d':' -f2)
    if [ -z "$PRE_COUNT" ]; then PRE_COUNT=0; fi
    echo -e "${YELLOW}- 同步中断前ES中有 ${PRE_COUNT} 条数据${NC}"
    
    # 停止同步容器
    echo -e "${YELLOW}- 中断同步进程...${NC}"
    docker compose -f docker-compose-test.yml down mysql-to-es-sync
    
    # 再次启动同步进程
    echo -e "${YELLOW}- 重新启动同步进程...${NC}"
    docker compose -f docker-compose-test.yml up -d mysql-to-es-sync
    
    # 等待同步完成
    echo -e "${YELLOW}- 等待同步完成...${NC}"
    sleep 20
    
    # 检查ES中的最终数据量
    FINAL_COUNT=$(curl -s http://localhost:9200/test_users/_count | grep -o '"count":[0-9]*' | cut -d':' -f2)
    if [ -z "$FINAL_COUNT" ]; then FINAL_COUNT=0; fi
    
    echo -e "${YELLOW}- 同步完成后ES中有 ${FINAL_COUNT} 条数据${NC}"
    
    if [ "$FINAL_COUNT" -eq 1000 ]; then
        echo -e "${GREEN}✓ 测试通过! 中断后重新同步数据量保持一致: ${FINAL_COUNT}/1000 条${NC}"
    else
        echo -e "${RED}✗ 测试失败! 中断后重新同步数据量不一致: ${FINAL_COUNT}/1000 条${NC}"
    fi
    
    # 查看同步日志
    echo -e "${YELLOW}- 同步日志摘要:${NC}"
    docker logs mysql-to-es-sync | tail -20
}

# 测试场景2: ES中已有数据的情况
test_existing_data() {
    echo -e "\n${BLUE}=== 测试场景2: ES中存在预先数据时的同步 ===${NC}"
    
    # 清理现有环境
    echo -e "${YELLOW}- 清理现有环境...${NC}"
    docker compose -f docker-compose-test.yml down -v
    rm -rf data/* 
    
    # 启动MySQL和ES容器
    echo -e "${YELLOW}- 启动MySQL和Elasticsearch容器...${NC}"
    docker compose -f docker-compose-test.yml up -d mysql elasticsearch
     
    sleep 30
    # 确认ES已就绪
    if curl -s http://localhost:9200/_cluster/health | grep -q "status"; then
        echo -e "${GREEN}✓ Elasticsearch服务已就绪${NC}"
    else
        echo -e "${RED}✗ Elasticsearch服务未就绪${NC}"
        return 1
    fi
    
    # 创建索引并预先添加10条数据
    echo -e "${YELLOW}- 向ES索引添加10条预先数据...${NC}"
    curl -X PUT "localhost:9200/test_users" -H 'Content-Type: application/json' -d'
    {
      "mappings": {
        "properties": {
          "id": { "type": "integer" },
          "username": { "type": "keyword" },
          "email": { "type": "keyword" },
          "age": { "type": "integer" },
          "status": { "type": "keyword" },
          "created_at": { "type": "date" },
          "updated_at": { "type": "date" }
        }
      }
    }' > /dev/null
    
    # 添加10条测试数据到ES
    for i in {1..10}; do
        curl -X POST "localhost:9200/test_users/_doc/pre$i" -H 'Content-Type: application/json' -d'{
          "id": '$i',
          "username": "preuser'$i'",
          "email": "preuser'$i'@example.com",
          "age": 30,
          "status": "active",
          "created_at": "2023-01-01T00:00:00",
          "updated_at": "2023-01-01T00:00:00"
        }' > /dev/null
    done
    
    # 刷新索引确保数据可见
    curl -X POST "localhost:9200/test_users/_refresh" > /dev/null
    
    # 检查ES中的预先数据量
    PRE_COUNT=$(curl -s http://localhost:9200/test_users/_count | grep -o '"count":[0-9]*' | cut -d':' -f2)
    echo -e "${YELLOW}- ES中已有 ${PRE_COUNT} 条预先数据${NC}"
    
    # 启动同步进程
    echo -e "${YELLOW}- 启动数据同步进程...${NC}"
    docker compose -f docker-compose-test.yml up -d mysql-to-es-sync
    
    # 等待同步完成
    echo -e "${YELLOW}- 等待同步完成...${NC}"
    sleep 20
    
    # 检查ES中的最终数据量
    FINAL_COUNT=$(curl -s http://localhost:9200/test_users/_count | grep -o '"count":[0-9]*' | cut -d':' -f2)
    MYSQL_COUNT=$(docker exec -i test-mysql mysql -uroot -pmysqlpass -e "SELECT COUNT(*) FROM testdb.test_users;" 2>/dev/null | grep -v "COUNT" | tr -d ' ')
    
    echo -e "${YELLOW}- 同步完成后:${NC}"
    echo -e "${YELLOW}  MySQL数据量: ${MYSQL_COUNT}${NC}"
    echo -e "${YELLOW}  ES数据量: ${FINAL_COUNT}${NC}"
    
    # 检查ES中是原始数据被覆盖还是新增
    PRE_EXISTS=0
    for i in {1..5}; do
        if curl -s "localhost:9200/test_users/_doc/pre$i" | grep -q "found\":true"; then
            PRE_EXISTS=$((PRE_EXISTS + 1))
        fi
    done
    
    if [ "$PRE_EXISTS" -gt 0 ]; then
        echo -e "${YELLOW}- 发现预先插入的文档仍然存在 (${PRE_EXISTS}/5)${NC}"
    else
        echo -e "${YELLOW}- 未发现预先插入的文档存在${NC}"
    fi
    
    # 查看ES中ID为1-5的数据来源
    echo -e "${YELLOW}- 检查ID 1-5的数据:"
    for i in {1..5}; do
        USER=$(curl -s "localhost:9200/test_users/_doc/$i" | grep -o '"username":"[^"]*' | cut -d':' -f2 | tr -d '"')
        if [ ! -z "$USER" ]; then
            echo -e "  ID $i: $USER${NC}"
        else
            echo -e "  ID $i: 未找到${NC}"
        fi
    done
    
    # 根据同步配置和实际结果判断测试是否通过
    # 如果配置为upsert并按ID设置文档ID，则应该覆盖预先数据
    
    if [ "$FINAL_COUNT" -ge "$MYSQL_COUNT" ]; then
        echo -e "${GREEN}✓ 测试通过! MySQL数据已全部同步到ES中${NC}"
        if [ "$FINAL_COUNT" -gt "$MYSQL_COUNT" ]; then
            echo -e "${YELLOW}! 注意: ES数据量(${FINAL_COUNT})大于MySQL数据量(${MYSQL_COUNT})${NC}"
            echo -e "${YELLOW}! 这是因为同步使用了upsert操作，但一些预先数据使用了不同的ID格式${NC}"
        fi
    else
        echo -e "${RED}✗ 测试失败! ES中数据量小于MySQL数据量${NC}"
    fi
    
    # 查看同步日志
    echo -e "${YELLOW}- 同步日志摘要:${NC}"
    docker logs mysql-to-es-sync | tail -20
}

# 主程序
echo -e "${BLUE}====================================================${NC}"
echo -e "${BLUE}   MySQL到ES同步验证测试                           ${NC}"
echo -e "${BLUE}====================================================${NC}"

docker compose  -f docker-compose-test.yml down -v

cp -a ../mysql_to_es_sync.py .
cp -a ../Dockerfile .
cp -a ../requirements.txt .


# 执行场景1测试
# test_interrupted_sync

# 执行场景2测试
test_existing_data

echo -e "\n${GREEN}验证测试完成${NC}"
echo -e "${YELLOW}停止所有容器: docker compose -f docker-compose-test.yml down${NC}" 
docker compose  -f docker-compose-test.yml down -v

rm -rf mysql_to_es_sync.py Dockerfile requirements.txt